/**
 * 笛卡尔积
 * @param arr
 * @returns
 */
function cartesian(arr) {
  if (arr.length < 2) return arr[0] || []
  return arr.reduce((col, set) => {
    let res = []
    col.forEach((c) => {
      set.forEach((s) => {
        let t = [].concat(Array.isArray(c) ? c : [c])
        t.push(s)
        res.push(t)
      })
    })
    return res
  })
}

const arr = [[1, 2], [5], [4]]

console.log(cartesian(arr))
// output [ [ 1, 5, 4 ], [ 2, 5, 4 ] ]
